// 函数的this关键字，在绝大多数情况下，函数的调用方式决定了this的值 （运行时绑定）
// this关键字是函数运行是自动生成的一个内部对象，只能在函数内部使用，总指向调用它的对象(也就是说他的上一级对象一直在变化)
// function aaa() {
//   // aaa
//   //

//   console.log("aaa");
//   bbb(); // <-- bbb
// }
// function bbb() {
//   // aaa --> bbb
//   // aaa

//   console.log("bbb");
//   fff(); // <-- fff
// }
// function fff() {
//   // aaa --> bbb --> fff
//   // bbb

//   console.log("fff");
// }
// aaa(); //
var name = "Jenny";
function person() {
  return this.name;
}
console.log(person());
var o = {
  a: 10,
  b: {
    fn: function () {
      console.log(this.a); //undefined
    },
    a: "史振远",
  },
};
o.b.fn();
const j = o.b.fn;
j();
// this关键字在函数作用域中的的规则
// this在构建函数关键字生成一个实力对象时，此时函数作用域中的this指向这个实例对象
// function test1() {
//   this.x = 1;
// }
// var obj = new test1();
// obj.x; // 1
// console.log(obj);
// 箭头函数 箭头函数的this是由上下文中this决定的，
// 捕获其所在上下文的this值作为自己的this值。这使得在回调函数或者需要保持this值不变的场合中，箭头函数非常有用
const obj = {
  sayThis: () => {
    console.log(this);
  },
};
obj.sayThis(); // window JavaScript sayThis
const globalSay = obj.sayThis;
globalSay();
setTimeout(() => {
  console.log(this.obj);
}, 1000);
setTimeout(function () {
  console.log(this.obj);
}, 2000);
